import { ref, reactive } from 'vue'

// 汇率管理服务
class ExchangeRateService {
    // 当前汇率 - 从localStorage获取或使用默认值
    private currentRate = ref(this.getInitialRate())

    // 定时器ID
    private updateTimer: NodeJS.Timeout | null = null

    // 自动更新间隔（毫秒）- 默认5分钟
    private updateInterval = 5 * 60 * 1000

    // 获取初始汇率
    private getInitialRate(): string {
        // 优先从localStorage获取
        const savedRate = localStorage.getItem('exchangeRate')
        if (savedRate) {
            return savedRate
        }

        // 如果没有保存的汇率，使用默认值
        return '0.052'
    }

    // 汇率历史记录
    private rateHistory = reactive<Array<{
        rate: string
        timestamp: number
        operator: string
    }>>([])

    // 获取当前汇率
    getCurrentRate(): string {
        return this.currentRate.value
    }

    // 设置汇率
    setRate(newRate: string, operator: string = 'system') {
        // 验证汇率格式
        const rateNum = parseFloat(newRate)
        if (isNaN(rateNum) || rateNum <= 0 || rateNum > 1) {
            throw new Error('汇率必须在0-1之间')
        }

        // 保存历史记录
        this.rateHistory.push({
            rate: this.currentRate.value,
            timestamp: Date.now(),
            operator: operator
        })

        // 更新当前汇率
        this.currentRate.value = newRate

        // 保存到localStorage
        localStorage.setItem('exchangeRate', newRate)

        // 触发汇率变化事件
        this.notifyRateChange(newRate)

        console.log(`汇率已更新: ${newRate}, 操作人: ${operator}`)
    }

    // 获取汇率历史
    getRateHistory() {
        return this.rateHistory
    }

    // 汇率变化监听器
    private listeners: Array<(rate: string) => void> = []

    // 添加汇率变化监听器
    addRateChangeListener(listener: (rate: string) => void) {
        this.listeners.push(listener)
    }

    // 移除汇率变化监听器
    removeRateChangeListener(listener: (rate: string) => void) {
        const index = this.listeners.indexOf(listener)
        if (index > -1) {
            this.listeners.splice(index, 1)
        }
    }

    // 通知汇率变化
    private notifyRateChange(newRate: string) {
        this.listeners.forEach(listener => {
            try {
                listener(newRate)
            } catch (error) {
                console.error('汇率变化监听器执行失败:', error)
            }
        })
    }

    // 根据汇率计算手续费
    calculateServiceFee(exchangeRate?: string): string {
        const rate = exchangeRate || this.currentRate.value
        const baseRate = 0.052 // 基准汇率
        const baseFee = 200 // 基准手续费
        const calculatedFee = Math.round((parseFloat(rate) / baseRate) * baseFee)
        return calculatedFee.toString()
    }

    // 启动自动更新
    startAutoUpdate() {
        if (this.updateTimer) {
            clearInterval(this.updateTimer)
        }

        this.updateTimer = setInterval(() => {
            this.autoUpdateRate()
        }, this.updateInterval)

        console.log('汇率自动更新已启动，间隔:', this.updateInterval / 1000, '秒')
    }

    // 停止自动更新
    stopAutoUpdate() {
        if (this.updateTimer) {
            clearInterval(this.updateTimer)
            this.updateTimer = null
            console.log('汇率自动更新已停止')
        }
    }

    // 设置更新间隔
    setUpdateInterval(intervalMs: number) {
        this.updateInterval = intervalMs
        if (this.updateTimer) {
            this.startAutoUpdate() // 重新启动定时器
        }
    }

    // 自动更新汇率（模拟从外部API获取）
    private autoUpdateRate() {
        try {
            // 模拟汇率波动（实际应用中这里应该调用真实的汇率API）
            const currentRate = parseFloat(this.currentRate.value)
            const fluctuation = (Math.random() - 0.5) * 0.002 // ±0.1%的波动
            const newRate = Math.max(0.001, Math.min(1, currentRate + fluctuation))

            // 自动更新汇率
            this.setRate(newRate.toFixed(4), 'auto')

            console.log(`汇率自动更新: ${this.currentRate.value}`)
        } catch (error) {
            console.error('自动更新汇率失败:', error)
        }
    }

    // 手动刷新汇率（从外部API获取最新汇率）
    async refreshRateFromAPI(): Promise<string> {
        try {
            // 调用真实汇率API，与基础设置页面保持一致
            const res = await fetch('https://api.exchangerate-api.com/v4/latest/USD')
            const data = await res.json()
            if (data && data.rates && data.rates.CNY && data.rates.JPY) {
                // 1 JPY = (CNY/USD) / (JPY/USD) = CNY/JPY
                const cnyPerUsd = data.rates.CNY
                const jpyPerUsd = data.rates.JPY
                const jpyToCny = cnyPerUsd / jpyPerUsd
                const newRate = jpyToCny.toFixed(5)

                this.setRate(newRate, 'api')
                return newRate
            } else {
                throw new Error('API返回数据格式错误')
            }
        } catch (error) {
            console.error('从API刷新汇率失败:', error)
            throw error
        }
    }
}

// 创建单例实例
const exchangeRateService = new ExchangeRateService()

// 启动自动更新
exchangeRateService.startAutoUpdate()

export { exchangeRateService }
export type { ExchangeRateService } 